package com.bytecodes.eaulas.comun.servicios;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.TableModel;

import com.bytecodes.eaulas.beans.Aula;
import com.bytecodes.eaulas.beans.Recurso;
import com.bytecodes.eaulas.beans.Reserva;
import com.bytecodes.eaulas.beans.ReservaRecurso;
import com.bytecodes.eaulas.beans.Rol;
import com.bytecodes.eaulas.beans.Usuario;
import com.bytecodes.eaulas.comun.EAulasTableModel;
import com.bytecodes.eaulas.conexion.GestorConexion;
import com.bytecodes.eaulas.mantenimiento.GestorAulas;
import com.bytecodes.eaulas.mantenimiento.GestorUsuarios;
import java.util.HashMap;

/**
 * Clase implementacion que contiene todos los m�todos de negocio
 * 
 * @author David,Robert,Armando.................
 * @version PAC4
 */


public class EAulasServiciosImpl extends UnicastRemoteObject implements EAulasServiciosInterface, Serializable {

	private static final long serialVersionUID = -6979182120879971625L;
	GestorDiscoConexion gestorDisco = null;	
	GestorUsuarios gestorUsuarios= null;
	GestorAulas gestorAulas=null;
	
	public EAulasServiciosImpl() throws RemoteException {
		super();
		try {
			gestorDisco = new GestorDiscoConexion();
			gestorDisco.conectarBD();
			gestorUsuarios = new GestorUsuarios(gestorDisco.getConexion());
			gestorAulas= new GestorAulas(gestorDisco.getConexion());
			
		} catch (Exception eX) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.bbdd.open") + "\n" + eX.getMessage(), 
					TDSLanguageUtils.getMessage("err.bbdd.general"), JOptionPane.ERROR_MESSAGE);
		}		
	}
	
	public List<Usuario> consultaUsuarios(String filtro) throws RemoteException{
		List<Usuario> listaUsuario= new ArrayList<Usuario>();
		try {
			GestorUsuarios gestorUsuario = new GestorUsuarios(gestorDisco.getConexion());
			return gestorUsuario.getUsuarios(filtro);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
		return listaUsuario;
	}
	
	public Boolean AltaUsuario(Usuario pUsuario, String idUsuarioCreador) throws RemoteException{
		try {
			return gestorUsuarios.InsertaUsuario(pUsuario, idUsuarioCreador);
		} catch (Exception exception) {
			exception.printStackTrace();
		}
		return true;
	}
	
	public List<Usuario> getTotal(String filtro) throws RemoteException{
		List<Usuario> listaUsuario= new ArrayList<Usuario>();
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.getTotal(filtro);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
		return listaUsuario;
	}

	public List<Reserva> getReixa(String filtro, String idClient) throws RemoteException{
		List<Reserva> listaBooking= new ArrayList<Reserva>();
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.getReixa(filtro,idClient);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
		return listaBooking;
	}

        public String getDescripcio(Integer idAula) throws RemoteException {
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.getDescripcio(idAula);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
		return "";
        }

        public Double getImporte(Integer idBooking) throws RemoteException {
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.getImporte(idBooking);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
		return 0.0;
        }

        public Boolean setUpdateResolt(String missatge, Integer Id) throws RemoteException {
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.setUpdateResolt(missatge, Id);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
                return false;
        }

        public Boolean setDeleteUser(Integer Id) throws RemoteException {
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.setDeleteUser(Id);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
                return false;
        }

        public Usuario getClient(String idClient) throws RemoteException {
                Usuario usuario = new Usuario();
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.getClient(idClient);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
		return usuario;
        }
        
        public List<Usuario> getClientes() throws RemoteException {
                List<Usuario> clientes = new ArrayList();
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.getClientes();
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("estadisticas.error") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("estadisticas.error.obtenerclientes"), JOptionPane.ERROR_MESSAGE);
		}
		return clientes;
        }
                        
        public List<HashMap> getDatosEstRend(String id, String fechaInicio, String fechaFin, String tipoEst) throws RemoteException {
                List<HashMap> clientes = new ArrayList();
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.getDatosEstRend(id, fechaInicio, fechaFin, tipoEst);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("estadisticas.error") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("estadisticas.error.obtenerdatos"), JOptionPane.ERROR_MESSAGE);
		}
		return clientes;
        }
        
        public List<Reserva> getDatosEstOcupacion(String id, String fechaInicio, String fechaFin, String tipoEst) throws RemoteException {
                List<Reserva> reservas = new ArrayList();
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.getDatosEstOcupacion(id, fechaInicio, fechaFin, tipoEst);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("estadisticas.error") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("estadisticas.error.obtenerdatos"), JOptionPane.ERROR_MESSAGE);
		}
		return reservas;
        }
   
    public List<Aula> consultaAulas() throws RemoteException {        
        List<Aula> listaAulas = new ArrayList<Aula>();
        try {
            GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
            return gestorConexion.consultaAulas();
        } catch (Exception eE) {
		JOptionPane.showMessageDialog(null, 
				TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
				TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
        }
       return listaAulas;        
    }

    public Aula consultaAulas(int pIdAula) throws RemoteException {
        Aula aula = new Aula();
        try {
            GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
            return gestorConexion.consultaAulas(pIdAula);
        } catch (Exception eE) {
		JOptionPane.showMessageDialog(null, 
				TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
				TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
        }
        
        return aula;
    }
    
   public List<Recurso> consultaExtras()throws RemoteException {
        List<Recurso> listaRecurso = new ArrayList<Recurso>();
        try {
            GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
            return gestorConexion.consultaExtras();
        } catch (Exception eE) {
		JOptionPane.showMessageDialog(null, 
				TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
				TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
        }
       return listaRecurso;        
    }
        
   public Integer dameUltimaReserva() throws RemoteException {
        Integer contador = 0 ;
        try {
            GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
            return gestorConexion.dameUltimaReserva();
        } catch (Exception eE) {
		JOptionPane.showMessageDialog(null, 
				TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
				TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
        }
       return contador;               
   }
   
   public Boolean setInsertReserva(Integer Id,String userid,Integer spaceid,Integer resourceId,String start_time,String end_time,Integer pax,String status,String creation_time,double importe) throws RemoteException {
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.setInsertReserva(Id,userid,spaceid,resourceId,start_time,end_time,pax,status,creation_time,importe);
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
                return false;       
   }
   
   public List<ReservaRecurso> getRecurso(Integer idBooking) throws RemoteException{
	  List<ReservaRecurso> listaRecurso= new ArrayList<ReservaRecurso>();
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.getRecurso(idBooking);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
		return listaRecurso;
	}
   
    public Recurso consultaRecurso(int idRecurso) throws RemoteException {
           Recurso recurso = null;
           try {
		GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
		return gestorConexion.consultaRecurso(idRecurso);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
		return recurso;
	}
    
    public List<Recurso> consultaRecursos(String filtro) throws RemoteException {
    	List<Recurso> lista = new LinkedList<Recurso>();
        try {
		GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
		return gestorConexion.consultaRecursos(filtro);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
		return lista;
	}
    public Recurso consultaExtra(int IdAula) throws RemoteException {
           Recurso recurso = null;
           try {
		GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
		return gestorConexion.consultaExtra(IdAula);
			
		} catch (Exception eE) {
			JOptionPane.showMessageDialog(null, 
					TDSLanguageUtils.getMessage("err.si.consultausuarios.getusuarios") + "\n" + eE.getMessage(), 
					TDSLanguageUtils.getMessage("err.si.consultausuarios"), JOptionPane.ERROR_MESSAGE);
		}
		return recurso;
	}

	@Override
	public Boolean AltaAula(Aula aula) throws RemoteException {
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.altaAula(aula);
			
		} catch (Exception eE) {
				System.out.println("Error");
		}
		return Boolean.TRUE;
	}

	@Override
	public Boolean AltaRecurso (Recurso recurso, String idCliente) throws RemoteException {
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.altaRecurso(recurso, idCliente);
			
		} catch (Exception eE) {
				System.out.println("Error");
		}
		return Boolean.TRUE;
	}

	@Override
	public EAulasTableModel getTableModel(String tableName, String filtro) throws RemoteException {
		try {
			EAulasTableModel mod = new EAulasTableModel (gestorDisco.getConexion(), tableName, filtro);
			return mod;
		} catch (SQLException e) {			
			System.out.println("Error");
		}
		return null;
	}

	@Override
	public Boolean BajaAula(Integer idAula, String idCliente) throws RemoteException {
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.bajaAula(idAula, idCliente);
			
		} catch (Exception eE) {
				System.out.println("Error");
		}
		return Boolean.TRUE;
	}
	
	public List<Aula> BuscaAulas (String filtro) throws RemoteException{
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.BuscaAulas(filtro);
			
		} catch (Exception eE) {
				System.out.println("Error");
		}
		return null;
	}
	
	public Boolean updateAula (Aula aula) throws RemoteException{
		try {
			GestorConexion gestorConexion = new GestorConexion(gestorDisco.getConexion());
			return gestorConexion.updateAula(aula);
			
		} catch (Exception eE) {
			return Boolean.FALSE;
		}	
	}

	@Override
	public List<Rol> getRoles() throws RemoteException {
		return gestorUsuarios.getRoles();
	}
	
	public Boolean bajaUsuario(String identificador, String idUsuarioCreador) throws RemoteException{
		return gestorUsuarios.eliminaUsuario(identificador,  idUsuarioCreador);
	}
	
	public Boolean updateUsuario(Usuario usuario, String idUsuarioCreador) throws RemoteException{
		return gestorUsuarios.updateUsuario(usuario,  idUsuarioCreador);
	}
	
	public boolean borraRecurso(Recurso recurso, String idCliente) throws RemoteException{
		return gestorAulas.borrarRecurso(recurso,idCliente);
	}

}	
	
